@namespace Oqtane.Modules.Admin.Register
@using System.Net
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@inject ISettingService SettingService
@inject ITimeZoneService TimeZoneService

@if (_initialized)
{
    @if (PageState.Site.AllowRegistration)
    {
        if (!_userCreated)
        {
            if (PageState.User != null)
            {
                <ModuleMessage Message="@Localizer["Info.Registration.Exists"]" Type="MessageType.Info" />
            }
            else
            {
                <ModuleMessage Message="@_passwordrequirements" Type="MessageType.Info" />
                <form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
                    <div class="container">
                        <div class="row mb-1 align-items-center">
                            <Label Class="col-sm-3" For="username" HelpText="Your username. Note that this field can not be modified once it is saved." ResourceKey="Username"></Label>
                            <div class="col-sm-9">
                                <input id="username" class="form-control" @bind="@_username" maxlength="256" required />
                            </div>
                        </div>
                        <div class="row mb-1 align-items-center">
                            <Label Class="col-sm-3" For="password" HelpText="Please choose a sufficiently secure password and enter it here" ResourceKey="Password"></Label>
                            <div class="col-sm-9">
                                <div class="input-group">
                                    <input id="password" type="@_passwordtype" class="form-control" @bind="@_password" autocomplete="new-password" required />
                                    <button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
                                </div>
                            </div>
                        </div>
                        <div class="row mb-1 align-items-center">
                            <Label Class="col-sm-3" For="confirm" HelpText="Enter your password again to confirm it matches the value entered above" ResourceKey="Confirm"></Label>
                            <div class="col-sm-9">
                                <div class="input-group">
                                    <input id="confirm" type="@_passwordtype" class="form-control" @bind="@_confirm" autocomplete="new-password" required />
                                    <button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
                                </div>
                            </div>
                        </div>
                        <div class="row mb-1 align-items-center">
                            <Label Class="col-sm-3" For="email" HelpText="Your email address where you wish to receive notifications" ResourceKey="Email"></Label>
                            <div class="col-sm-9">
                                <input id="email" class="form-control" @bind="@_email" maxlength="256" required />
                            </div>
                        </div>
                        <div class="row mb-1 align-items-center">
                            <Label Class="col-sm-3" For="displayname" HelpText="Your full name" ResourceKey="DisplayName"></Label>
                            <div class="col-sm-9">
                                <input id="displayname" class="form-control" @bind="@_displayname" maxlength="50" />
                            </div>
                        </div>
                        <div class="row mb-1 align-items-center">
                            <Label Class="col-sm-3" For="timezone" HelpText="Your time zone" ResourceKey="TimeZone">Time Zone:</Label>
                            <div class="col-sm-9">
                                <select id="timezone" class="form-select" @bind="@_timezoneid">
                                    <option value="">&lt;@SharedLocalizer["Not Specified"]&gt;</option>
                                    @foreach (var timezone in _timezones)
                                    {
                                        <option value="@timezone.Id">@timezone.DisplayName</option>
                                    }
                                </select>
                            </div>
                        </div>
                    </div>
                    <br />
                    <button type="button" class="btn btn-primary" @onclick="Register">@Localizer["Register"]</button>
                    <button type="button" class="btn btn-secondary" @onclick="Cancel">@SharedLocalizer["Cancel"]</button>
                    @if (_allowsitelogin)
                    {
                        <br />

                        <br />
                        <NavLink href="@NavigateUrl("login")">@Localizer["Login"]</NavLink>
                    }
                </form>
            }
        }
    }
    else
    {
        <ModuleMessage Message="@Localizer["Info.Registration.Disabled"]" Type="MessageType.Info" />
    }
}

@code {
    private bool _initialized = false;
    private List<Models.TimeZone> _timezones;
    private string _passwordrequirements;
    private string _username = string.Empty;
    private ElementReference form;
    private bool validated = false;
    private string _password = string.Empty;
    private string _passwordtype = "password";
    private string _togglepassword = string.Empty;
    private string _confirm = string.Empty;
    private string _email = string.Empty;
    private string _displayname = string.Empty;
    private string _timezoneid = string.Empty;
    private bool _userCreated = false;
    private bool _allowsitelogin = true;

    public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous;

    protected override async Task OnInitializedAsync()
    {
        _passwordrequirements = await UserService.GetPasswordRequirementsAsync(PageState.Site.SiteId); 
        _allowsitelogin = bool.Parse(SettingService.GetSetting(PageState.Site.Settings, "LoginOptions:AllowSiteLogin", "true"));
        _timezones = TimeZoneService.GetTimeZones();
        _timezoneid = PageState.Site.TimeZoneId;
        _initialized = true;
    }

    protected override void OnParametersSet()
    {
        _togglepassword = SharedLocalizer["ShowPassword"];     
    }

    private async Task Register()
    {
        validated = true;
        var interop = new Interop(JSRuntime);
        if (await interop.FormValid(form))
        {
            try
            {
                bool _isEmailValid = Utilities.IsValidEmail(_email);

                if (_isEmailValid)
                {
                    if (_password == _confirm)
                    {
                        var user = new User
                        {
                            SiteId = PageState.Site.SiteId,
                            Username = _username,
                            Password = _password,
                            Email = _email,
                            DisplayName = (_displayname == string.Empty ? _username : _displayname),
                            TimeZoneId = _timezoneid,
							PhotoFileId = null
                        };
                        user = await UserService.AddUserAsync(user);

                        if (user != null)
                        {
                            await logger.LogInformation("User Created {Username} {Email}", _username, _email);
                            _userCreated = true;
                             AddModuleMessage(Localizer["Info.User.AccountCreate"], MessageType.Info);
                        }
                        else
                        {
                            await logger.LogError("Error Adding User {Username} {Email}", _username, _email);
                            AddModuleMessage(Localizer["Error.User.AddInfo"], MessageType.Error);
                        }
                    }
                    else
                    {
                        AddModuleMessage(Localizer["Message.Password.NoMatch"], MessageType.Warning);
                    }
                }
                else
                {
                    AddModuleMessage(Localizer["Message.Required.UserInfo"], MessageType.Warning);
                }
            }
            catch (Exception ex)
            {
                await logger.LogError(ex, "Error Adding User {Username} {Email} {Error}", _username, _email, ex.Message);
                AddModuleMessage(Localizer["Error.User.Add"], MessageType.Error);
            }
        }
        else
        {
            AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
        }
    }

    private void Cancel()
    {
        NavigationManager.NavigateTo(PageState.ReturnUrl);
    }

    private void TogglePassword()
	{
		if (_passwordtype == "password")
		{
			_passwordtype = "text";
			_togglepassword = SharedLocalizer["HidePassword"];
		}
		else
		{
			_passwordtype = "password";
			_togglepassword = SharedLocalizer["ShowPassword"];
		}
	}
}
